#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
#include <string.h>
#include <errno.h>

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

// 模拟按键函数
void simulate_key(int fd, int key_code, int press) {
    struct input_event ev;
    ev.type = EV_KEY;
    ev.code = key_code;
    ev.value = press ? 1 : 0; // 1 for press, 0 for release
    write(fd, &ev, sizeof(struct input_event));

    // 需要发送一个EV_SYN事件，以便系统处理按键事件
    ev.type = EV_SYN;
    ev.code = SYN_REPORT;
    ev.value = 0;
    write(fd, &ev, sizeof(struct input_event));
}

int main() {
    int fd = open("/dev/input/event3", O_RDWR|O_NONBLOCK); // 替换X为实际的设备编号
    if (fd < 0) {
        perror("Failed to open the input device");
        return 1;
    }

    struct input_event ev;
    while (1) {
        if (read(fd, &ev, sizeof(struct input_event)) > 0) {
            if (ev.type == EV_KEY) {
                if (ev.value == 1) { // 检测到按键按下
                    switch (ev.code) {
                        case KEY_W:
                            simulate_key(fd, KEY_UP, 1);
                            break;
                        case KEY_S:
                            simulate_key(fd, KEY_DOWN, 1);
                            break;
                        case KEY_A:
                            simulate_key(fd, KEY_LEFT, 1);
                            break;
                        case KEY_D:
                            simulate_key(fd, KEY_RIGHT, 1);
                            break;
                        case KEY_J:
                            simulate_key(fd, 79, 1);
                            break;
                        case KEY_K:
                            simulate_key(fd, 80, 1);
                            break;
                    }
                } else if (ev.value == 0) { // 检测到按键松开
                    switch (ev.code) {
                        case KEY_W:
                            simulate_key(fd, KEY_UP, 0);
                            break;
                        case KEY_S:
                            simulate_key(fd, KEY_DOWN, 0);
                            break;
                        case KEY_A:
                            simulate_key(fd, KEY_LEFT, 0);
                            break;
                        case KEY_D:
                            simulate_key(fd, KEY_RIGHT, 0);
                            break;
                        case KEY_J:
                            //79为按键1
                            simulate_key(fd, 79, 0);
                            break;
                        case KEY_K:
                            //79为按键1
                            simulate_key(fd, 80, 0);
                            break;    
                    }
                } else if (ev.value == 2) { // 检测到按键松开
                    switch (ev.code) {
                        case KEY_W:
                            simulate_key(fd, KEY_UP, 2);
                            break;
                        case KEY_S:
                            simulate_key(fd, KEY_DOWN, 2);
                            break;
                        case KEY_A:
                            simulate_key(fd, KEY_LEFT, 2);
                            break;
                        case KEY_D:
                            simulate_key(fd, KEY_RIGHT, 2);
                            break;
                        case KEY_J:
                            //79为按键1
                            simulate_key(fd, 79, 2);
                            break;
                        case KEY_K:
                            //79为按键1
                            simulate_key(fd, 80, 2);
                            break;    
                    }
                }
            }
        }
       // usleep(10000); // 避免过度占用CPU
    }

    close(fd);
    return 0;
}